package pwd.allen;

import java.util.concurrent.TimeUnit;

/**
 * java.lang.OutOfMemoryError : unable to create new native thread
 * 成因：
 *  (1)创建线程数太多了，超过系统允许的单个进程可创建的线程数（linux默认root用户无上限，其他用户1024），或者超过系统承载极限
 *  (2)系统内存耗尽，无法为新线程分配内存
 * 说明：要演示的话需要放到linux上并用root以外的用户执行
 *
 * 操作方式：
 *  到pwd目录的上级目录下执行一下命令
 *  javac -encoding utf-8 pwd/allen/NotNativeMethodMain.java
 *  java pwd/allen/NotNativeMethodMain
 *
 * 查看线程状态：
 * top -p {pid} -H
 * 或者
 * jstack {pid}
 *
 * @author 门那粒沙
 * @create 2021-02-24 22:38
 **/
public class NotNativeMethodMain {

    public static void main(String[] args) throws InterruptedException {
        int total = 1024;
        if (args.length > 0) {
            total = Integer.parseInt(args[0]);
        }

        for (int i = 0; i < total; i++) {
            System.out.println("i:" + i);
            new Thread(() -> {
                try {
                    TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
                } catch (InterruptedException e) {}
            }).start();
        }

        while (Thread.activeCount() > 2) {
            TimeUnit.SECONDS.sleep(1);
        }
    }
}
